package com.edu.exam.entity.grade;

import com.edu.exam.enums.grading.AnalysisPrecision;
import com.edu.exam.enums.grading.AnalysisStatus;
import com.edu.exam.enums.grading.AnalysisType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 成绩分析结果表实体类
 *
 * <p>成绩分析结果表实体用于存储成绩分析的结果数据，包含
 * 分析类型、分析条件、分析结果、状态信息等。为成绩分析功能提供完整的结果存储和管理。</p>
 *
 * <p>核心功能：
 * - 分析结果存储：存储各种类型成绩分析的结果数据
 * - 分析条件记录：记录生成分析结果的条件和参数
 * - 状态管理：管理分析结果的生成状态和有效性
 * - 版本控制：支持分析结果的版本管理和历史追踪
 * - 过期管理：控制分析结果的有效期和自动失效</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-15
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GradeAnalysisResult {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 分析类型
     *
     * <p>分析的类型标识。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "analysis_type", nullable = false, length = 30)
    private AnalysisType analysisType;

    /**
     * 分析条件
     *
     * <p>分析的条件和参数，JSON格式存储。</p>
     */
    @Lob
    @Column(name = "analysis_condition", columnDefinition = "LONGTEXT")
    private String analysisCondition;

    /**
     * 分析结果
     *
     * <p>分析的结果数据，JSON格式存储。</p>
     */
    @Lob
    @Column(name = "analysis_result", columnDefinition = "LONGTEXT")
    private String analysisResult;

    /**
     * 分析状态
     *
     * <p>分析的当前状态。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "analysis_status", nullable = false, length = 20)
    private AnalysisStatus analysisStatus = AnalysisStatus.PENDING;

    /**
     * 数据版本
     *
     * <p>分析结果的版本号。</p>
     */
    @Column(name = "data_version", length = 20)
    private String dataVersion = "1.0";

    /**
     * 过期时间
     *
     * <p>分析结果的过期时间。</p>
     */
    @Column(name = "expire_time")
    private LocalDateTime expireTime;

    /**
     * 是否过期
     *
     * <p>标记分析结果是否已过期。</p>
     */
    @Column(name = "is_expired", nullable = false)
    private Boolean isExpired = false;

    /**
     * 分析开始时间
     *
     * <p>分析计算开始的时间。</p>
     */
    @Column(name = "analysis_start_time")
    private LocalDateTime analysisStartTime;

    /**
     * 分析完成时间
     *
     * <p>分析计算完成的时间。</p>
     */
    @Column(name = "analysis_end_time")
    private LocalDateTime analysisEndTime;

    /**
     * 分析耗时
     *
     * <p>分析计算的总耗时，单位毫秒。</p>
     */
    @Column(name = "analysis_duration_ms")
    private Long analysisDurationMs;

    /**
     * 数据样本数量
     *
     * <p>分析使用的数据样本数量。</p>
     */
    @Column(name = "sample_count")
    private Integer sampleCount;

    /**
     * 数据范围
     *
     * <p>分析数据的范围描述。</p>
     */
    @Column(name = "data_scope", length = 200)
    private String dataScope;

    /**
     * 时间范围
     *
     * <p>分析数据的时间范围。</p>
     */
    @Column(name = "time_range", length = 100)
    private String timeRange;

    /**
     * 分析精度
     *
     * <p>分析结果的精度级别。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "analysis_precision", length = 20)
    private AnalysisPrecision analysisPrecision;

    /**
     * 置信度
     *
     * <p>分析结果的置信度（0-1）。</p>
     */
    @Column(name = "confidence_level", precision = 3, scale = 2)
    private Double confidenceLevel;

    /**
     * 错误信息
     *
     * <p>分析失败时的错误信息。</p>
     */
    @Column(name = "error_message", columnDefinition = "TEXT")
    private String errorMessage;

    /**
     * 警告信息
     *
     * <p>分析过程中的警告信息。</p>
     */
    @Column(name = "warning_message", columnDefinition = "TEXT")
    private String warningMessage;

    /**
     * 分析算法
     *
     * <p>使用的分析算法类型。</p>
     */
    @Column(name = "analysis_algorithm", length = 50)
    private String analysisAlgorithm;

    /**
     * 分析模型
     *
     * <p>使用的分析模型信息。</p>
     */
    @Column(name = "analysis_model", length = 100)
    private String analysisModel;

    /**
     * 分析参数
     *
     * <p>分析算法的参数配置，JSON格式存储。</p>
     */
    @Column(name = "analysis_parameters", columnDefinition = "TEXT")
    private String analysisParameters;

    /**
     * 质量评分
     *
     * <p>分析结果的质量评分（0-100）。</p>
     */
    @Column(name = "quality_score")
    private Integer qualityScore;

    /**
     * 可信度评分
     *
     * <p>分析结果的可信度评分（0-100）。</p>
     */
    @Column(name = "reliability_score")
    private Integer reliabilityScore;

    /**
     * 完整性评分
     *
     * <p>分析结果的完整性评分（0-100）。</p>
     */
    @Column(name = "completeness_score")
    private Integer completenessScore;

    /**
     * 准确性评分
     *
     * <p>分析结果的准确性评分（0-100）。</p>
     */
    @Column(name = "accuracy_score")
    private Integer accuracyScore;

    /**
     * 分析标签
     *
     * <p>分析结果的分类标签。</p>
     */
    @Column(name = "analysis_tags", length = 500)
    private String analysisTags;

    /**
     * 关键发现
     *
     * <p>分析过程中的关键发现，JSON格式存储。</p>
     */
    @Column(name = "key_findings", columnDefinition = "TEXT")
    private String keyFindings;

    /**
     * 建议
     *
     * <p>基于分析结果的建议，JSON格式存储。</p>
     */
    @Column(name = "recommendations", columnDefinition = "TEXT")
    private String recommendations;

    /**
     * 限制条件
     *
     * <p>分析的限制条件和假设，JSON格式存储。</p>
     */
    @Column(name = "limitations", columnDefinition = "TEXT")
    private String limitations;

    /**
     * 附加数据
     *
     * <p>附加的分析数据，JSON格式存储。</p>
     */
    @Column(name = "additional_data", columnDefinition = "TEXT")
    private String additionalData;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建人ID
     */
    @Column(name = "creator_id")
    private Long creatorId;

    /**
     * 更新人ID
     */
    @Column(name = "updater_id")
    private Long updaterId;

    /**
     * 版本号（乐观锁）
     */
    @Version
    @Column(name = "version")
    private Integer version = 0;

    /**
     * 逻辑删除标记
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;
}